home *** CD-ROM | disk | FTP | other *** search
-
-
-
- _______
- ____|__ | (R)
- --| | |-------------------
- | ____|__ | Association of
- | | |_| Shareware
- |__| o | Professionals
- -----| | |---------------------
- |___|___| MEMBER
-
-
-
-
-
-
- Het programma dat hieronder wordt beschreven is gemaakt
- door
- Feico Nater Shareware,
- Beukweg 24,
- 7556 DE Hengelo.
-
-
- Dit programma wordt beschikbaar gesteld als shareware.
- Wat is shareware? Het is software dat door de gebruikers
- gecopieerd en uitgedeeld mag worden, maar ik, de auteur behoud
- het auteursrecht. Misschien heeft u het programma voor een
- laag bedrag `gekocht' van een bulletin-board en er voor
- betaald, maar ik krijg daar geen cent van. Ik verwacht dat u
- mij rechtstreeks betaalt, want ik verdien mijn levensonderhoud
- met het maken van shareware.
- Dus, als dit programma u bevalt en u besluit het te
- gebruiken, dan wordt van u verwacht dat u een bedrag van 40
- gulden (inclusief BTW) overmaakt op mijn rekening bij de
- Postbank, nummer 96541. Helaas kan ik geen kredietkaarten
- accepteren.
- Waarom zou u registreren? Het kost u natuurlijk geld.
- Maar ik zal u op de hoogte houden van verdere ontwikkelingen
- en u krijgt het recht om nieuwere versies te bestellen voor de
- prijs van porto en floppy. Tenslotte zal ik bereid zijn om
- naar uw verlangens te luisteren.
- En als het programma u niet bevalt? Dan kan u het
- weggooien. Maar ongetwijfeld zal het idee van shareware u
- bevallen, omdat u niet veel geld hoeft te betalen voor iets
- dat achteraf toch tegenvalt.
- Maar of u nu registreert of niet, u wordt aangemoedigd
- dit systeem verder rond te delen. Geef copieën aan uw vrien-
- den. De copieën die u ronddeelt moeten volledig en ongewij-
- zigd zijn, maar gebruik van file-compressie is toegestaan. U
- mag alleen een maximum van tien gulden vragen voor de floppy,
- verpakking en verzending.
-
-
- Over de auteur
-
- Ik werk met computers sedert 1970. Ik heb een HBO-studie
- in informatica voltooid. Daarna heb ik vele jaren gewerkt in
- de defensie-industrie, en mijn collega's beschouwden mij als
- de bekwaamste programmeur onder hen. Maar dank zij Gorbatsjov
- (wat ik hem niet kwalijk kan nemen) ging het slechter met de
- defensie-industrie. Sindsdien werk ik als shareware-auteur.
-
-
-
-
- *******************************
- * D I S A S T E R *
- *******************************
-
- Disaster is een interactieve disassembler voor de IBM-PC.
-
- Een disassembler is niets bijzonders. Het programma DEBUG
- wordt bij MSDOS geleverd en bevat een disassembler. Maar
- DEBUG kent alleen de instructies van de 8086 en 8088. Verder
- levert DEBUG geen coding die geschikt is om weer als input
- voor een assembler te dienen.
-
- Geen enkele disassembler maakt met één druk op de knop een
- keurig assemblerprogramma. In tegendeel, het disassembleren
- van een beetje programma is vele dagen werk.
-
- De eenvoudigst denkbare disassembler werkt rechttoe-
- rechtaan. Hij leest het machinetaalprogramma van voor tot
- achter en vertaalt alles naar assembler-taal, ongeacht of het
- code of data is.
-
- Disaster werkt interactief. U kan het machinetaalprogramma
- op uw gemak bekijken, labels en commentaar toevoegen, aangeven
- wat code en wat data is. Het resultaat kan worden opgeborgen
- om de volgende dag verder te kunnen gaan. Tenslotte maakt
- DISASTER een correct assemblerprogramma.
-
- Deze gebruiksaanwijzing is heel kort. Er is niet meer uit
- te leggen. Kennis van de PC en de assembleertaal wordt echter
- bekend verondersteld.
-
- DEMONSTRATIE
-
-
- U start DISASTER de eerste keer met het commando:
- DISASTER
- Er komt nu een foutmelding die u mag negeren. Op het scherm
- verschijnt de prompt --> om aan te geven dat DISASTER uw
- commando's verwacht.
-
- Vervolgens leest u een programma in met het commando:
- R naam.EXE
- of:
- R naam.COM
- of:
- R naam.SYS
-
- Wil u iets disassembleren wat reeds in het geheugen staat,
- dan is het commando:
- R segmentadres.ROM
-
- Nu moet u eerst aangeven dat uw programma als instructiecode
- moet worden gedisassembleerd met het commando:
- C Lstartlocation,I
-
- Nu begint het disassembleren! Geef het commando
- U Lstartlocation
- wat resulteert in een stukje gedisassembleerd programma op het
- scherm. Links verschijnen de adressen, daarnaast de
- mnemonische code, en rechts (in kleur) de oorspronkelijke
- machinetaal. Een groen blokje betekent dat er geen geldige
- opcode werd gevonden. Voorvoegsels komen in geel, modrm-bytes
- en sib-bytes in rood, overige bytes in groen.
-
- Varianten op het U-commando zijn:
- U adres disassembleer 20 regels vanaf adres
- U adres,adres disassembleer van .. tot ..
- U disassembleer volgende 20 regels
- <return> idem
-
- Adressen in commando's worden altijd hexadecimaal opgegeven.
- In plaats van adressen kan u ook labels (zie hierna) opgeven.
-
- LABELS
-
-
- Alle adressen komen hexadecimaal op het scherm. Natuurlijk
- wil u labels zien. Dat kan met het commando:
- L adres,label
-
- Een label moet, zoals gebruikelijk, met een letter beginnen.
- Verder moet minstens een keer de letter G tot en met Z er in
- voorkomen. De maximale lengte van een label is veertien
- tekens.
-
- Komt in een label geen van de letters G tot en met Z voor,
- dan beschouwt DISASTER het als een hexadecimaal adres.
-
- Wees voorzichtig met het gebruik van labels die met de
- letter L beginnen. De functie die automatisch controls
- genereert veronderstelt namelijk dat zo'n label bij
- instructiecode staat.
-
- Labels kunnen worden gebruikt in commando's. Het U commando
- wordt dan bijvoorbeeld: U label,label.
-
- Labels kunnen worden verwijderd met het commando:
- L label,-
- of, wat op het zelfde neerkomt:
- L adres,-
-
- Labels kunnen van naam worden veranderd met het commando:
- L oude naam,nieuwe naam
-
- Het is niet mogelijk twee labels op het zelfde adres te
- definiëren.
-
- Het maximale aantal labels is 4090.
-
- CONTROLs
-
-
- Niet alles wat u ziet is instructiecode. Er is ook data.
- De disassembler kan echter het verschil niet zien. Bovendien
- bestaat er code en data in soorten. U moet zelf aangeven wat
- code en wat data is en welke soort het is. Dat gaat door
- controls te zetten met het commando:
- C adres,letter(s)
- of, wat op het zelfde neerkomt:
- C label,letter(s)
-
- Een control kan worden verwijderd met:
- C adres,-
- of:
- C label,-
-
- Vanaf het aangegeven adres wordt gedisassembleerd volgens de
- letter.
-
- Die letter kan zijn:
- B hexadecimale bytes
- T tekst tussen quotes, voor zover mogelijk
- W hexadecimale woorden
- I instructiecode voor Intel chips
- IV instructiecode voor NEC V20 of V30
- IA instructiecode voor 80386 in protected mode met
- een adreslengte van 32 bits.
- IO instructiecode voor 80386 in protected mode met
- een operandlengte van 32 bits.
- IAO combinatie van IA en IO.
-
- B, T en W zijn data-controls, de overige zijn code-controls.
- Dit is een belangrijk onderscheid voor de verderop besproken
- A- en B-commando's.
- De controls delen uw programma in stukken. Er zijn
- datastukken en codestukken.
-
- Als DISASTER een opcode tegenkomt die geldig is op NEC-chips
- maar niet op Intel-chips, of andersom, dan wordt die gewoon
- gedisassembleerd. Of I of IV werd opgegeven is dan niet van
- belang. Maar er zijn opcodes die bij NEC en Intel iets anders
- betekenen. In dat geval beslist I of IV. Programma's waarbij
- het onderscheid tussen I en IV belangrijk is zijn overigens
- zeldzaam.
-
- IA en IO kunnen alleen worden gebruikt bij programma's die
- op de 80386 in protected mode draaien. In real mode geldt
- immers altijd een default-adres- en -operand-lengte van 16
- bits.
-
- Het maximale aantal controls is 16380.
-
- INITIEEL OPGEVOERDE LABELS EN CONTROLS
-
- Leest u een file in, dan worden automatisch wat labels en
- controls bij de velden van de header gezet. De meeste labels
- beginnen met de letter Z. Er is ook een label met de naam
- LSTARTLOCATION, en dat is de plaats waar de executie begint.
- In het grootste deel van uw programma geldt een T-control.
- Dat mag vreemd lijken, maar het is gedaan omdat nog niet
- bekend is waar de overige controls moeten staan.
-
- AUTOMATISCH GENEREREN VAN LABELS
-
- Het handmatig plaatsen van de labels en controls is een
- enorm karwei. Daarom is dit werk in DISASTER gedeeltelijk
- geautomatiseerd.
-
- Labels worden automatisch gegenereerd met het commando:
- A adres,adres
-
- DISASTER doorzoekt nu uw programma, en geeft tegelijk een
- listing op het scherm. Alleen de codestukken worden
- onderzocht, datastukken worden overgeslagen. Elke keer als
- DISASTER een adresverwijzing tegenkomt wordt hiervoor een
- label opgevoerd.
- Zo'n opgevoerd label heeft de vorm: L45A3_27E5.
- De eerste letter van het opgevoerde label geeft het soort
- verwijzing aan:
- L spronginstructie
- W woorddata
- T bytedata
-
- Na die eerste letter komt het hexadecimale adres waar het
- label naar verwijst, want het kind moet een naam hebben.
- Daarna een onderstreping, en ten slotte het adres waar de
- verwijzing voor het eerst werd aangetroffen. Dat laatste
- vergemakkelijkt het onderzoek van het programma.
-
- Elke keer als een label wordt opgevoerd toont DISASTER een
- blokje op het scherm. Zo'n blokje komt dus te staan bij
- iedere JMP- en CALL-instructie en bij iedere
- geheugenverwijzing waar nog geen label aanwezig is.
-
- AUTOMATISCH GENEREREN VAN CONTROLS
-
- Controls worden automatisch gegenereerd met het commando
- B adres,adres
-
- DISASTER doorzoekt nu de labels van uw programma. Elke keer
- als DISASTER in een datastuk een label tegenkomt dat met een L
- begint wordt hier een control I opgevoerd, zodat de verdere
- programmatekst als instructiecode wordt geïnterpreteerd. Bij
- de eerstvolgende onvoorwaardelijke RET- of JMP-instructie
- wordt een control opgevoerd om de oorspronkelijke toestand te
- herstellen.
-
- Elke keer als een control wordt opgevoerd toont DISASTER een
- blokje op het scherm. Zo'n blokje komt dus:
- 1 bij een label dat met een L begint en dat in een
- datagebied stond.
- 2 bij de eerste RET- of JMP-instructie daarna.
-
- Elke keer als een control I wordt opgevoerd, wordt bovendien
- het betreffende stuk doorzocht naar adresverwijzingen, waar
- dan (zoals in het vorige hoofdstuk stond) labels voor worden
- gegenereerd.
-
- AANWIJZINGEN
-
- Meestal begint een disassembly aldus:
-
- C:\disaster Start DISASTER
- --->Rprogr.com lees het programma
- --->B100,ffff genereer labels en controls
- --->B100,ffff
- --->B100,ffff
- --->B100,ffff
-
- Op het scherm ziet u hoe steeds meer labels worden geplaatst
- en hoe steeds meer code-controls worden gezet.
-
- Het commando B100,ffff kan eenvoudig worden herhaald met de
- F3-toets. Herhaal het tot DISASTER meldt dat er niet meer
- labels en controls zijn toegvoegd.
-
- Als het een beetje wil is de disassembly hiermee al haast
- voltooid, en u hoeft er niets voor te doen! Kom daar eens om
- bij een andere disassembler.
-
- Kan er dan niets foutgaan? Helaas, niets is volmaakt,
- bijvoorbeeld in de volgende gevallen:
- 0150 JNZ L0123
- 0152 JZ L0156
- 0154 ADD B[BX+SI],AL
- Het B-commando denkt dat de laatste instructie code is, want
- er staat geen onvoorwaardelijke sprongopdracht voor. Maar JNZ
- en JZ zijn samen onvoorwaardelijk. De coding vanaf adres 0154
- zal dus als instructiecode worden beschouwd. Komen hier
- dingen voor die lijken op instrcties met adresverwijzingen,
- dan worden er valse labels gegenereerd.
- Als u oplet tijdens de uitvoering van het B-commando, dan
- zal u dit onheil wel opmerken. Onderbreek het commando met
- een willekeurige toets, blader met het U-commando door het
- programma om de juiste plek te vinden en zet op adres 0154 een
- data-control.
-
- INT 020
- Dit is het einde van het programma, wat trouwens ook geldt
- voot INT 021 met AH=00 of 04C. Het B-commando herkent dit
- niet. U moet zelf hierachter een data-control zetten.
-
- JMP [08170+BX]
- Dit is een sprong via een tabel van sprongadressen. Dit
- wordt door DISASTER niet herkend. U moet zelf labels
- toekennen aan de adressen in de tabel. Gebruikt u labels die
- met een L beginnen, dan zal het B-commando de gelabelde tekst
- als code beschouwen.
-
- COMMENTAAR
-
- U kan commentaar toevoegen met het commando:
- ;adres,tekst
- en natuurlijk ook met
- ;label,tekst
-
- Let op de kommapunt die dit commando inluidt!
-
- Commentaar kan worden verwijderd met:
- ;adres,-
- of:
- ;label,-
-
- De maximale lengte van een commentaarregel is 127 bytes.
-
- Er kunnen geen twee commentaarregels op een adres staan.
-
- De maximale hoeveelheid commentaar is ongeveer 62500 bytes,
- plus wat overhead.
-
- Verder zal u, natuurlijk, de gegenereerde labels vervangen
- door namen die duidelijk aangeven wat er gebeurt.
-
- MAKEN VAN EEN SOURCE-FILE
-
-
- Het uiteindelijke doel van disassembleren is dat er een
- source-file ontstaat. Deze source-file kan met een assembler
- weer geassembleerd worden. De source-file wordt geopend met
- het commando
- W
- De source-file heeft de zelfde naam als de .SYS-, .EXE- of
- .COM-file, doch met de extensie .8.
-
- Zolang de source-file open is is de prompt >>>. Alleen de
- commando's U en Q zijn nu toegestaan.
-
- Na het commando W geeft u een of meer U-commando's. Op het
- scherm komen nu alleen nog maar de adressen, de
- gedisassembleerde tekst gaat naar de file.
-
- Tenslotte sluit u de file met het commando
- Q
- Nu verschijnt weer de prompt -->.
-
- Wellicht verwacht u dat u, door de source-file weer te
- assembleren, weer de zelfde .COM- of .EXE-file terugkrijgt.
- In de praktijk zal dat tegenvallen, omdat meerdere machine-
- instructies de zelfde functie hebben. Bijvoorbeeld:
- MOV AX,BX 8BC3 of 89D8
- REP MOVSB F3A4 of F2A4
- ADD BX,5 83C305 of 81C30500
- JMP $+8 EB06 of E90500
-
- Verder zijn er instructies denkbaar die voor de processor
- niet uitvoerbaar zijn, zoals SHL AL,30 of BOUND AX,BX.
- DISASTER accepteert zulke instructies, de assembler zal ze
- misschien weigeren.
-
- HULP
-
- Hulpschermen zijn beschikbaar met de toetsen F5 tot en met
- F10. F1 en F3 zijn dus vrij om commando's geheel of
- gedeeltelijk te herhalen.
- Een hulpscherm wordt met een willekeurige toets verwijderd.
- Druk liever niet op de hulptoetsen terwijl DISASTER met een
- opdracht bezig is, het heeft enigszins vreemde (geen ernstige)
- gevolgen.
-
- STOPPEN EN VERDERGAAN
-
-
- U heeft na vele uren werk uw programma uitgebreid met Labels
- en Controls. Om de volgende dag verder te kunnen gaan geeft u
- het commando:
- S
- Er wordt nu een zogenaamde scriptfile gemaakt. Deze heeft
- de extensie .SCR en, als u geen andere naam opgaf, dezelfde
- naam als uw programma.
-
- Bestaat de scriptfile al, dan vraagt DISASTER om
- bevestiging.
-
- Tenslotte stopt u met het commando:
- Q
- Is er nog geen scriptfile gemaakt, dan vraagt DISASTER om
- bevestiging.
-
- Om verder te gaan start u de disassembler met het commando
- DISASTER filenaam
- waarbij u de naam van de scriptfile opgeeft. DISASTER
- onderzoekt namelijk eerst of de opgegeven filenaam een
- scriptfile is. Is dat niet het geval, dan zoekt DISASTER een
- .COM- of .EXE-file.
-
- Een scriptfile is een ASCII-file en bevat gewone commando's
- voor de disassembler. Niets verbiedt u de scriptfile met een
- teksteditor te bewerken.
-
- OVERZICHT VAN DE 80386-CODE
-
- D: richting. Als dit bit 1 is, dan is het datatransport in
- omgekeerde richting
- W: woord. Als dit bit 1 is, dan is de data 16 (of 32) bits
- (anders 8).
- S: sign-extend. Als dit bit 1 is, dan is de brondata 8 bits,
- waarvan het hoogste bit gepropageerd wordt.
- M: mod/rm-byte
- I: immediate data
-
- hexadecimaal
- binair mnemonisch
- 00 M 0000 00dw ADD memory,register
- 04 I 0000 010w ADD register,immediate
- 06 0000 0110 PUSH ES
- 07 0000 0111 POP ES
- 08 M 0000 00dw OR memory,register
- 0C I 0000 010w OR register,immediate
- 0E 0000 0110 PUSH CS
- 0F 0000 0111 Zie verderop
- 10 M 0000 00dw ADC memory,register
- 14 I 0000 010w ADC register,immediate
- 16 0000 0110 PUSH SS
- 17 0000 0111 POP SS
- 18 M 0000 00dw SBB memory,register
- 1C I 0000 010w SBB register,immediate
- 1E 0000 0110 PUSH DS
- 1F 0000 0111 POP DS
- 20 M 0000 00dw AND memory,register
- 24 I 0000 010w AND register,immediate
- 26 0000 0110 ES: prefix
- 27 0000 0111 DAA
- 28 M 0000 00dw SUB memory,register
- 2C I 0000 010w SUB register,immediate
- 2E 0000 0110 CS: prefix
- 2F 0000 0111 DAS
- 30 M 0000 00dw XOR memory,register
- 34 I 0000 010w XOR register,immediate
- 36 0000 0110 SS: prefix
- 37 0000 0111 AAA
- 38 M 0000 00dw CMP memory,register
- 3C I 0000 010w CMP register,immediate
- 3E 0000 0110 DS: prefix
- 3F 0000 0111 AAS
-
- 40 0100 0rrr INC wordregister
- 48 0100 1rrr DEC wordregister
- 50 0101 drrr PUSH, POP wordregister
- 60 0110 000d PUSHA, POPA
- 62 M 0110 0010 BOUND wordregister,memory
- 63 M 0110 0011 ARPL memory,wordregister
- 64 0110 0100 80386 FS: prefix, NEC REPNC
- 65 0110 0101 80386 GS: prefix, NEC REPC
- 66 0110 0110 80386 OS prefix
- 67 0110 0111 80386 AS prefix
- 68 I 0110 10s0 PUSH immediate
- 69 M I 0110 10s1 IMUL register,memory,immediate
- 6C 0110 11dw INS, OUTS
- 70 I 0111 cccc J voorwaardelijk
-
- 80 M/0 1000 00sw ADD memory,immediate
- 80 M/1 1000 00sw OR memory,immediate
- 80 M/2 1000 00sw ADC memory,immediate
- 80 M/3 1000 00sw SBB memory,immediate
- 80 M/4 1000 00sw AND memory,immediate
- 80 M/5 1000 00sw SUB memory,immediate
- 80 M/6 1000 00sw XOR memory,immediate
- 80 M/7 1000 00sw CMP memory,immediate
- 82 1000 0010 niet gedefinieerd
- 84 M 1000 010w TEST memory,register
- 86 M 1000 011w XCHG memory,register
- 88 M 1000 10dw MOV memory,register
- 8C M 1000 11d0 MOV memory,segmentregister
- 8D M 1000 1101 LEA wordregister,memory
- 8F M/0 1000 1111 POP memory
- 90 1001 0rrr XCHG AX,wordregister
- 98 1001 100w CBW, CWD
- 9A I 1001 1010 CALL intersegment
- 9B 1001 1011 WAIT
- 9C 1001 110d PUSHF, POPF
- 9E 1001 111d SAHF, LAHF
- A0 M 1010 00dw MOV register,memory
- A4 1010 010w MOVS
- A6 1010 011w CMPS
- A8 I 1010 100w TEST AL,immediate, TEST
- AX,immediate
- AA 1010 101w STOS
- AC 1010 110w LODS
- AE 1010 111w SCAS
- B0 I 1011 wrrr MOV register,immediate
- C0 M/0 I 1100 000w ROL memory,immediate
- C0 M/1 I 1100 000w ROR memory,immediate
- C0 M/2 I 1100 000w RCL memory,immediate
- C0 M/3 I 1100 000w RCR memory,immediate
- C0 M/4 I 1100 000w SHL memory,immediate
- C0 M/5 I 1100 000w SHR memory,immediate
- C0 M/6 I 1100 000w niet gedefinieerd
- C0 M/7 I 1100 000w SAR memory,immediate
- C2 I 1100 0010 RET immediate
- C3 1100 0011 RET
- C4 M 1100 0100 LES wordregister,memory
- C5 M 1100 0101 LDS wordregister,memory
- C6 M/0 I 1100 011w MOV memory,immediate
- C6 M/1 e.v Niet gedefinieerd
- C8 I I 1100 1000 ENTER word,byte
- C9 1100 1001 LEAVE
- CA I 1100 1010 RETF word
- CB 1100 1011 RETF
- CC 1100 1100 INT 3
- CD I 1100 1101 INT byte
- CE 1100 1110 INTO
- CF 1100 1111 IRET
- D0 M/0 1101 000w ROL memory,1
- D0 M/1 1101 000w ROR memory,1
- D0 M/2 1101 000w RCL memory,1
- D0 M/3 1101 000w RCR memory,1
- D0 M/4 1101 000w SHL memory,1
- D0 M/5 1101 000w SHR memory,1
- D0 M/6 1101 000w niet gedefinieerd
- D0 M/7 1101 000w SAR memory,CL
-
- D2 M/0 1101 001w ROL memory,CL
- D2 M/1 1101 001w ROR memory,CL
- D2 M/2 1101 001w RCL memory,CL
- D2 M/3 1101 001w RCR memory,CL
- D2 M/4 1101 001w SHL memory,CL
- D2 M/5 1101 001w SHR memory,CL
- D2 M/6 1101 001w niet gedefinieerd
- D2 M/7 1101 001w SAR memory,CL
- D4 I 1101 0100 AAM
- D5 I 1101 0101 AAD
- D6 1101 0110 ongedefinieerd
- D7 1101 0111 XLAT
- D8 M/0 1101 1000 FADD dword
- D8 M/1 1101 1000 FMUL dword
- D8 M/2 1101 1000 FCOM dword
- D8 M/3 1101 1000 FCOMP dword
- D8 M/4 1101 1000 FSUB dword
- D8 M/5 1101 1000 FSUBR dword
- D8 M/6 1101 1000 FDIV dword
- D8 M/7 1101 1000 FDIVR dword
- D8 C0 1101 1000 FADD 0,i
- D8 C8 1101 1000 FMUL 0,i
- D8 D0 1101 1000 FCOM 0,i
- D8 D8 1101 1000 FCOMP 0,i
- D8 E0 1101 1000 FSUB 0,i
- D8 E8 1101 1000 FSUBR 0,i
- D8 F0 1101 1000 FDIV 0,i
- D8 F8 1101 1000 FDIVR 0,i
-
- D9 M/0 1101 1001 FLD dword
- D9 M/1 1101 1001 niet gedefinieerd
- D9 M/2 1101 1001 FST dword
- D9 M/3 1101 1001 FSTP dword
- D9 M/4 1101 1001 FLDENV dword
- D9 M/5 1101 1001 FLDCW dword
- D9 M/6 1101 1001 FSTENV dword
- D9 M/7 1101 1001 FSTCW dword
- D9 C0 1101 1001 FLD i
- D9 C8 1101 1001 FXCH 0,i
- D9 D0 1101 1001 FNOP
- D9 D1 e.v. 1101 1001 niet gedefinieerd
- D9 E0 1101 1001 FCHS
- D9 E1 1101 1001 FABS
- enz.
- D9 FF 1101 1001 FCOS
-